﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Onshi.POS.AccesoDatos;
using Onshi.POS.AccesoDatos.Interfaces;
using Onshi.POS.Modelo.Entidades;

namespace Onshi.POS.Repositorios
{
    public class RepositorioUsuario : RepositorioEntidad<Usuario, Int32>
    {
        #region Constructores

        public RepositorioUsuario()
            : base()
        {
            servicioDatosUsuario = new ServicioDatosUsuario();
        }

        #endregion

        #region Atributos

        private IServicioDatosUsuario servicioDatosUsuario;

        #endregion

        #region Propiedades

        private IServicioDatosUsuario ServicioDatosUsuario
        {
            get { return servicioDatosUsuario; }
        }

        private RepositorioPerfil RepositorioPerfil
        {
            get { return new RepositorioPerfil(); }
        }
        #endregion

        #region Metodos

        protected override Usuario FilaAEntidad(DataRow fila)
        {
            var usuario = new Usuario();
            usuario.Id = (Int32)fila["IdUsuario"];
            usuario.Perfil = RepositorioPerfil.DevolverPorId((Int32)fila["IdPerfil"]);
            usuario.Nombre = (String)fila["Nombre"];
            usuario.Clave = (String)fila["Clave"];
            usuario.EstaEliminado = (Boolean)fila["EstaEliminado"];
            usuario.Observacion = (String)fila["Observacion"];
            return usuario;
        }

        public List<Usuario> DevolverTodos()
        {
            using (var ds = ServicioDatosUsuario.Usuarios_DevolverTodos())
                entidades = TablaALista(ds.Tables[0]);
            return entidades;
        }

        public override Usuario DevolverPorId(Int32 id)
        {
            var entidad = entidades.Where(x => x.Id == id).FirstOrDefault();
            if (entidad == null)
                using (var ds = ServicioDatosUsuario.Usuarios_DevolverPorId(id))
                    if (ds.Tables[0].Rows.Count != 0)
                    {
                        entidad = FilaAEntidad(ds.Tables[0].Rows[0]);
                        entidades.Add(entidad);
                    }
            return entidad;
        }

        public Usuario DevolverPorNombre(String nombre)
        {
            var entidad = (from item in entidades
                           where item.Nombre == nombre
                           select item).FirstOrDefault();
            if (entidad == null)
                using (var ds = ServicioDatosUsuario.Usuarios_DevolverPorNombre(nombre))
                    if (ds.Tables[0].Rows.Count != 0)
                    {
                        entidad = FilaAEntidad(ds.Tables[0].Rows[0]);
                        entidades.Add(entidad);
                    }
            return entidad;
        }

        public void Insertar(Usuario entidad)
        {
            entidad.Id = ServicioDatosUsuario.Usuarios_Insertar(entidad.Perfil.Id, entidad.Nombre, entidad.Clave, entidad.Observacion);
        }

        public void Modificar(Usuario entidad)
        {
            ServicioDatosUsuario.Usuarios_Modificar(entidad.Id, entidad.Perfil.Id, entidad.Nombre, entidad.Clave, entidad.Observacion);
        }

        public void ModificarPerfiles(Perfil perfil, Perfil perfilNuevo)
        {
            ServicioDatosUsuario.Usuarios_ModificarPerfiles(perfil.Id, perfilNuevo.Id);
        }

        public void Eliminar(Usuario entidad)
        {
            ServicioDatosUsuario.Usuarios_Eliminar(entidad.Id);
            entidad.EstaEliminado = true;
        }

        public void Habilitar(Usuario entidad)
        {
            ServicioDatosUsuario.Usuarios_Habilitar(entidad.Id);
            entidad.EstaEliminado = false;
        }

        #endregion
    }
}
